离线地图显示 (离线矢量地图)Sample详情 (离线瓦片地图)Sample详情

最后更新时间:2019年6月17日

离线地图显示方法

离线地图数据类型包括离线矢量地图和离线瓦片地图,两种地图加载显示的方式也略有不同:

加载地图有多种方法,不同的方法适用于不同的数据类型,具有不同的应用场景。离线矢量地图、离线瓦片地图显示的核心方法如下表所示,从表中可以观察到,它们具有三种相同的方法,另外各自具有一种独有的方法,开发者可根据数据类型、实际需求来确定采用哪种方法。

方法 接口 地图类型 使用场景
加载地图文档 loadFromFile / loadFromFileAsync 矢量 / 瓦片 最常用,适于地图文档中只有一个地图的情况,若有多个地图则默认加载第一个。
加载地图文档对应索引的地图 loadFromDocument / loadFromDocumentAsync 矢量 / 瓦片 适于加载有多个地图的地图文档,可控制加载某个地图。
通过地图文档获取Map setMap / setMapAsync 矢量 / 瓦片 适于加载地图之前需处理的情况,如删除部分图层、获取信息等。
通过数据库创建图层,从而构建Map setMap / setMapAsync 矢量 若获取到的数据只有“.mgdb”,无“.mapx”时,只能采用此方法。
基于ServerLayer实例化Map setMap / setMapAsync 瓦片 直接使用代加载瓦片地图,不用在桌面工具中配置地图文档。

一、加载地图文档

调用loadFromDocument / loadFromDocumentAsync方法加载地图文档,此方法是加载离线地图最常用、最简单的一种。前提是必须事先组织配置好mapx地图文档文件。

//引用类库(无需开发人员手动编写)
import com.zondy.mapgis.android.mapview.MapView;
import com.zondy.mapgis.android.environment.Environment.AuthorizeCallback;

//定义MapView对象
private MapView mMapView;
//获取移动端设备sd卡的根目录
public final static String rootPath = Environment.getExternalStorageDirectory().getPath();
public final static String systemPath = Environment.getExternalStorageDirectory().getPath() + "/MapGIS Mobile 2D Sample/";

//环境初始化,必须在使用SDK各组件之前调用,会自动建立根目录结构
com.zondy.mapgis.android.environment.Environment.initialize(systemPath, this);
//授权请求
com.zondy.mapgis.android.environment.Environment.requestAuthorization(this, new AuthorizeCallback() {
    @Override
    //授权完成后回调
    public void onComplete() {
        //获取MapView对象
        mMapView = (MapView) findViewById(R.id.mapView);
        //同步方法
        mMapView.loadFromFile(MainActivity.rootPath + "/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/WuHan.mapx");

        //异步方法
        mMapView.loadFromFileAsync(MainActivity.rootPath + "/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/WuHan.mapx");  
        //异步加载地图回调监听
        mMapView.setMapLoadListener(new MapView.MapViewMapLoadListener() {
            @Override
            public void mapViewWillStartLoadingMap(MapView arg0, String arg1) {
                //开始加载地图
            }
        
            @Override
            public void mapViewDidFinishLoadingMap(MapView arg0, String arg1) {
                //地图加载完成
            }
        
            @Override
            public void mapViewDidFailLoadingMap(MapView arg0, String arg1) {
                //地图加载失败
            }
        });
    }
});

代码说明:如果采用异步方法加载地图,可以为地图视图设置地图加载回调监听器,监听地图的加载情况。

二、加载地图文档对应索引的地图

通过loadFromDocument / loadFromDocumentAsync来加载地图文档对应索引的地图,可以加载mapx地图文档中的指定地图,同样适用于离线矢量地图、离线瓦片地图。

//创建文档对象
Document mapDoc = new Document();
//打开地图文档
mapDoc.open(MainActivity.rootPath+"/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/WuHan.mapx");
//同步方法:在地图视图中加载第1个地图
mMapView.loadFromDocument(mapDoc, 0);
//异步方法:利用地图加载完成的回调方法判断地图加载是否成功
mMapView.loadFromDocumentAsync(mapDoc, 0, new MapViewFinishCallback() {
    @Override
    public void onDidFinish(boolean arg0) {
        if (arg0) {
            //地图加载完成
        } else {
            //地图加载失败
        }
    }
});

三、通过地图文档获取Map

通过地图文档Document获取Map,调用setMap / setMapAsync方法加载地图。同样可以加载地图文档中指定的地图。

//创建文档对象
Document mapDoc = new Document();
//打开地图文档
mapDoc.open(MainActivity.rootPath+"/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/WuHan.mapx");
//通过地图文档获取地图对象
map = mapDoc.getMaps().getMap(0);

//同步方法:通过地图视图对象设置地图
mMapView.setMap(map);
//异步方法:可监听地图的加载情况
mMapView.setMapAsync(map, new MapViewFinishCallback() {
    @Override
    public void onDidFinish(boolean arg0) {
        if (arg0) {
            //地图加载完成
        } else {
            //地图加载失败
        }
    }
});

代码说明:利用setMap或setMapAsync将地图Map赋予给地图视图MapView时,Map对象需定义为成员变量,从而实现生命周期的正确管理。

四、通过数据库创建图层构建Map

通过通过数据库DataBase获取数据,创建图层,从而构建Map,然后调用setMap / setMapAsync方法加载地图。此方法只适用于离线矢量数据,针对获取的数据中只有.mgdb数据库,无.mapx地图文档时。

//构造数据库对象,并打开
DataBase dataBase=new DataBase();
dataBase.open(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGIS Mobile 2D Sample/Map/MapShow/WuHan/武汉MKT.mgdb");
if(dataBase.hasOpened()){
    //获取所有简单要素类的ID
    IntList list1=dataBase.getXclseIDs(XClsType.SFCls, 0);
    for (int i = 0; i < list1.size(); i++) {
        //根据ID从数据库中获取简单要素类信息
        FClsInfo fclsinfo=(FClsInfo) dataBase.getXclsInfo(XClsType.SFCls,list1.get(i));
        //创建VectorLayer图层对象,设置URL和名称
        VectorLayer vectorLayer=new VectorLayer(VectorLayerType.SFclsLayer);
        vectorLayer.setURL(fclsinfo.getURL());
        vectorLayer.setName(fclsinfo.getName());
        //添加图层到map中
        map.append(vectorLayer);
    }
    //获取所有注记类的ID
    IntList list2=dataBase.getXclseIDs(XClsType.ACls, 0);
    for (int i = 0; i < list2.size(); i++) {
        //获取注记类信息
        AnnClsInfo annClsInfo=(AnnClsInfo)dataBase.getXclsInfo(XClsType.ACls,list2.get(i));
        //创建VectorLayer图层对象,设置URL和名称
        VectorLayer vectorLayer=new VectorLayer(VectorLayerType.AnnotationLayer);
        vectorLayer.setURL(annClsInfo.getURL());
        vectorLayer.setName(annClsInfo.getName());
        //添加图层到map中
        map.append(vectorLayer);
    }
    //同步加载地图
    mapView.setMap(map);
    //异步加载地图
    mapView.setMapAsync(map, new MapViewFinishCallback() {
        @Override
        public void onDidFinish(boolean arg0) {
            if (arg0) {
                //地图加载完成
            } else {
                //地图加载失败
            }
        }
    });
}

五、基于ServerLayer实例化Map

通过服务图层ServerLayer实例化Map,然后调用setMap / setMapAsync方法加载地图。离线瓦片地图能够采用此方法,不适用于离线矢量地图。此方法加载离线瓦片数据不用将其组织为地图文档,直接加载.TDF格式的瓦片数据文件即可。

//创建MapServer对象
MapServer mapServer = ServerLayer.createMapServerByType(MapServerType.MapGISHDF);
//设置服务图层数据的url,即离线瓦片数据的存放路径
mapServer.setURL(MainActivity.rootPath+"/MapGIS Demo/Map/MapShow/WorldMKTTile.TDF");
//设置服务图层的数据源
serverLayer.setMapServer(mapServer);
//设置图层名称
serverLayer.setName("离线服务图层");
//获取Map对象
mMap = mMapView.getMap();
//方式一:append()添加图层
mMap.append(serverLayer);
//方式二:insert()插入图层
//mMap.insert(0, serverLayer);

//同步方法:将地图对象显示在地图容器中
mapView.setMap(map);
//异步方法:
mMapView.setMapAsync(map, new MapView.MapViewFinishCallback() {
    @Override
    public void onDidFinish(boolean arg0) {
        if (arg0) {
            //地图加载成功
        } else {
            //地图加载失败
        }
    }
});

显示效果如下所示:

离线矢量地图显示效果.jpg 离线瓦片地图显示效果.jpg